<?php

namespace Sharks\Core\Support\FrontEnd;

use Sharks\Core\AppContext;
use Sharks\Core\Support\Base\Argument;
use Sharks\Core\Support\Base\Files;
use Sharks\Core\Support\Base\Obj;
use Sharks\Core\Support\Base\ObjWrapper;
use Sharks\Core\Support\Base\Precondition;

/**
 * 静态资源处理
 */
class AssetHandler {

    /**
     * 通用处理
     * @param  string $filePath         源文件路径，包含源文件名
     * @param  string $destAssetPath    目标文件夹路径（不包含文件名）。
     * @return Obj                      obj(type, url)
     */
    public function line($filePath, $moreAssetDir = null) {

        $p = new ObjWrapper(pathinfo($filePath));

        $assetsUrl = '/assets';
        $assetsDir = AppContext::instance()->path()->app->public . $assetsUrl;
        if (!empty($moreAssetDir)) {
            $assetsDir .= $moreAssetDir;
            $assetsUrl .= $moreAssetDir;
        }
                
        switch($p->extension) {
            case 'css':
                CssHandler::handle($filePath, $assetsDir, $p);
                break;

            case 'less':
                LessHandler::handle($filePath, $assetsDir, $p);
                $p->extension = 'css';
                break;

            case 'js':
                JsHandler::handle($filePath, $assetsDir, $p);
                break;

            // img file
            case 'jpg':
            case 'jpeg':
            case 'png':
            case 'gif':
                ImgHandler::handle($filePath, $assetsDir, $p);
                break;

            default:
                // Just Copy
                CopyHandler::handle($filePath, $assetsDir, $p);
            }

        return new ObjWrapper(array('type' => $p->extension, 'url' => $assetsUrl . '/' . $p->filename . '.' . $p->extension));
    }

    /**
     * 仅复制
     * @param  [type] $filePath      [description]
     * @param  [type] $destAssetPath [description]
     * @return [type]                [description]
     */
    public function copy($filePath, $moreAssetDir) {
        $p = new ObjWrapper(pathinfo($filePath));

        $assetsUrl = '/assets';
        $assetsDir = AppContext::instance()->path()->app->public . $assetsUrl;
        if (!empty($moreAssetDir)) {
            $assetsDir .= $moreAssetDir;
            $assetsUrl .= $moreAssetDir;
        }
        CopyHandler::handle($filePath, $assetsDir, $p);

        return new ObjWrapper(array('type' => $p->extension, 'url' => $assetsUrl . '/' . $p->filename . '.' . $p->extension));

    }

    /**
     * 比较源文件，以及欲覆盖的文件创建时间。如果如果目标文件不存在或源文件创建时间较新，则返回true。否则返回false。
     * @param  string $sourceFilePath 源文件路径。不能为空，否则抛出异常。
     * @param  string $destFilePath   目标文件路径
     * @return boolean
     */
    public static function compareTime($sourceFilePath, $destFilePath) {
        Precondition::check(file_exists($sourceFilePath), "$sourceFilePath 源文件不存在");

        if (file_exists($destFilePath)) {
            return filectime($sourceFilePath) > filectime($destFilePath);
        }
        return true;
    }
}